
#ifndef TP_SOURCE_H
#define TP_SOURCE_H

TP_DECL_BEGIN

struct _TpSource;
typedef struct _TpSource TpSource;

typedef int (*TpSourceGet)(TpSource* thiz);
typedef int (*TpSourceCheck)(TpSource* thiz);
typedef TpRet (*TpSourceDispatch)(TpSource* thiz);
typedef void (*TPSourceDestroy)(TpSource* thiz);

struct _TpSource
{
	TpSourceGet get;
	TpSourceCheck check;
	TpSourceDispatch dispatch;
	TPSourceDestroy destroy;

	char priv[1];
};

/*
	获取指定事件源的文件描述符
	大于0为有效值
*/
static inline int tp_source_get(TpSource* thiz)
{
	if (NULL == thiz || NULL == thiz->get) return -1;

	return thiz->get(thiz);
}

/*
	获取指定事件源的等待时间
	若为-1，表示事件的发生与时间无关
	若为0，表示事件将立即发生
	若大于0，表示时间将在相应时间之后发生
*/
static inline int tp_source_check(TpSource* thiz)
{
	if(NULL == thiz || NULL == thiz->check) return -1;

	return thiz->check(thiz);
}

/*
	处理该事件
*/
static inline TpRet tp_source_dispatch(TpSource* thiz)
{
	if(NULL == thiz || NULL == thiz->dispatch) return TP_RET_FAIL;

	return thiz->dispatch(thiz);
}

/*
	销毁该事件
*/
static inline void tp_source_destroy(TpSource* thiz)
{
	if(NULL != thiz && NULL != thiz->destroy)
	{
		thiz->destroy(thiz);
	}

	return;
}

TP_DECL_END

#endif /*TP_SOURCE_H*/